#include <stdio.h>
#include <string.h>
#include <omnetpp.h>
#include "MyMsg_m.h"

using namespace omnetpp;

class NodeR : public cSimpleModule
{
private:
    simsignal_t arrivalSignal;

protected:
    virtual MyMsg *generateMessage();
    virtual void forwardMessage(MyMsg *msg);
    virtual void initialize() override;
    virtual void handleMessage(cMessage *msg) override;
};

Define_Module(NodeR);

void NodeR::initialize()
{
    arrivalSignal = registerSignal("arrival");

    if(getIndex() == 0)
    {
        MyMsg *msg = generateMessage();
        scheduleAt(0.0 , msg);
    }
}

void NodeR::handleMessage(cMessage *msg)
{
    // 强制类型转换
    MyMsg *ttmsg = check_and_cast<MyMsg *>(msg);

    if(ttmsg->getDestination() == getIndex())
    {
        int hopcount = ttmsg->getHopCount();
        emit(arrivalSignal , hopcount);

        EV << "Message " << ttmsg << " arrived after " << hopcount << " hops.\n";
        bubble("ARRIVED, starting new one!");

        delete ttmsg;

        EV << "Generating another message: ";
        MyMsg *newmsg = generateMessage();
        EV << newmsg << endl;
        forwardMessage(newmsg);
    }
    else
    {
        forwardMessage(ttmsg);
    }
}

MyMsg *NodeR::generateMessage()
{
    int src = getIndex();
    int n = getVectorSize();
    int dest = intuniform(0 , n-2);
    if(dest >= src)
        dest++;

    char msgname[20];
    sprintf(msgname,"src-%d-dst-%d",src,dest);

    MyMsg *msg = new MyMsg(msgname);
    msg->setSource(src);
    msg->setDestination(dest);
    return msg;
}

void NodeR::forwardMessage(MyMsg *msg)
{
    msg->setHopCount(msg->getHopCount()+1);

    int n = gateSize("gate");
    int k = intuniform(0 , n-1);

    EV << "Forwarding message " << msg << " on node["<< getIndex() << "] gate[" << k << "]\n";
    send(msg,"gate$o",k);
}
